from multiprocessing import Process, Pool                               # Process创建进程， Pool创建管理进程池
from threading import Thread                                            # thread创建线程
import requests                                                         # 导入requests，用request.get()请求HTTPresponse类型网站
import time                                                             # 导入time，用于处理时间


def get(url='http://www.baidu.com'):

    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
    }
    r = requests.get(url=url, headers=headers)                          # 函数使用方法
    time.sleep(1)                                                       # 延时
    print(r.status_code)                                                # #status.code方法返回网页状态码，200表示正常响应
    return r.status_code


if __name__ == '__main__':
    start = time.time()                                                 # 返回当前时间，并赋值为start
    # 利用Python实现一个多线程程序
    thread_list = []                                                    # 创建和启动多线程
    for _ in range(5):
        t = Thread(target=get, args=('https://www.zhihu.com',))         # target后为函数入口，args后为传参索引
        thread_list.append(t)                                           # 汇总为列表
        t.start()                                                       # 启动多线程
    [t.join() for t in thread_list]                                     # 进程同步，主进程等待子进程全部完成后，一同结束程序
    end = time.time()                                                   # 返回当前时间，并赋值为end
    print(f'多线程耗时：{end - start} s')                                 # 计时

    # 将上述多线程程序改为多进程
    process_list = []                                                   # 进程列表
    start = time.time()                                                 # 开始时间
    for _ in range(5):                                                  # 同线程，创建和启动线程
        p = Process(target=get, args=('https://www.zhihu.com',))
        process_list.append(p)
        p.start()
    [p.join() for p in process_list]
    end = time.time()
    print(f'多进程耗时：{end - start} s')                                  # 计时

    # 多进程使用进程池
    pool = Pool(8)                                                      # 任务管理器》性能》逻辑处理器数
    start = time.time()
    for _ in range(5):
        pool.apply_async(get, args=('https://www.zhihu.com',))          # 非阻塞传不定参
    pool.close()                                                        # 关闭进程池
    pool.join()                                                         # 主进程阻塞等待子进程的退出， join方法要在close或terminate之后使用
    end = time.time()
    print(f'进程池耗时：{end - start} s')                                 # 计时

